Системное программирование

Ресурсы  приложения,  их  создание  и использование

Системное программирование

Ресурсы в Windows-приложениях — это данные, которые хранятся внутри исполняемых файлов (EXE, DLL) или в отдельных файлах и используются программой во время выполнения. Ресурсы позволяют включать в приложение такие элементы, как иконки, строки, диалоговые окна, меню, курсоры, изображения и другие данные, не загромождая основной код программы.

Ресурсы приложения
Системное программирование

1. Типы ресурсов в Windows

Ресурсы в Windows делятся на несколько типов, каждый из которых имеет своё назначение:

Ресурсы приложения
Системное программирование

1.1. Стандартные типы ресурсов

  • Иконки (ICON): используются для отображения значков приложения.
  • Курсоры (CURSOR): определяют внешний вид курсора мыши.
  • Диалоговые окна (DIALOG): шаблоны для создания окон с элементами управления.
  • Меню (MENU): определяют структуру меню приложения.
  • Строки (STRINGTABLE): текстовые данные, которые могут быть локализованы.
  • Битовые изображения (BITMAP): растровые изображения.
  • Версия (VERSIONINFO): информация о версии приложения.
Ресурсы приложения
Системное программирование

1.2. Пользовательские типы ресурсов

Разработчик может создавать собственные типы ресурсов для хранения любых данных, например, конфигурационных файлов, XML-документов или бинарных данных.

Ресурсы приложения
Системное программирование

2. Создание ресурсов

Ресурсы в Windows создаются с помощью файлов ресурсов (.rc), которые компилируются в бинарный формат и включаются в исполняемый файл.

Ресурсы приложения
Системное программирование

2.1. Файл ресурсов (.rc)

Файл ресурсов — это текстовый файл, который описывает все ресурсы, используемые в приложении. Пример простого .rc файла:

Ресурсы приложения
Системное программирование
// Иконка приложения
IDI_ICON1 ICON "icon.ico"

// Курсор
IDC_CURSOR1 CURSOR "cursor.cur"

// Строковая таблица
STRINGTABLE
BEGIN
    101 "Привет, мир!"
    102 "Это пример строки."
END

// Диалоговое окно
IDD_DIALOG1 DIALOGEX 0, 0, 200, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Пример диалога"
BEGIN
    DEFPUSHBUTTON "OK", IDOK, 10, 70, 50, 14
    PUSHBUTTON "Отмена", IDCANCEL, 70, 70, 50, 14
END
Ресурсы приложения
Системное программирование

2.2. Компиляция ресурсов

Файл ресурсов компилируется с помощью компилятора ресурсов (rc.exe), который создает бинарный файл (.res). Этот файл затем включается в исполняемый файл на этапе линковки.

Пример команды для компиляции:

rc.exe app.rc
Ресурсы приложения
Системное программирование

3. Использование ресурсов

Ресурсы загружаются и используются в коде программы с помощью API Windows.

3.1. Загрузка иконки

Пример загрузки иконки:

HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

3.2. Загрузка строки

Пример загрузки строки из строковой таблицы:

char buffer[100];
LoadString(hInstance, 101, buffer, sizeof(buffer));
MessageBox(NULL, buffer, "Ресурс", MB_OK);
Ресурсы приложения
Системное программирование

3.3. Создание диалогового окна

Пример создания диалогового окна:

DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);

3.4. Загрузка битового изображения

Пример загрузки изображения:

HBITMAP hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
Ресурсы приложения
Системное программирование

4. Управление ресурсами

Ресурсы в Windows могут быть как встроенными (внутри EXE или DLL), так и внешними (отдельные файлы). Встроенные ресурсы защищены от изменений, но их сложнее обновлять. Внешние ресурсы проще обновлять, но они менее безопасны.

4.1. Встроенные ресурсы

  • Хранятся внутри исполняемого файла.
  • Загружаются с помощью функций API, таких как LoadIcon, LoadString, LoadBitmap.
  • Пример:
    HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
    
Ресурсы приложения
Системное программирование

4.2. Внешние ресурсы

  • Хранятся в отдельных файлах.
  • Загружаются с помощью функций, таких как LoadImage, LoadLibrary (для DLL).
  • Пример:
    HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, "image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    
Ресурсы приложения
Системное программирование

5. Локализация ресурсов

Локализация — это процесс адаптации приложения для разных языков и регионов. В Windows локализация ресурсов достигается за счет создания отдельных файлов ресурсов для каждого языка.

Ресурсы приложения
Системное программирование

5.1. Создание локализованных ресурсов

  • Создайте отдельный .rc файл для каждого языка.
  • Используйте директиву LANGUAGE для указания языка и кодовой страницы.
  • Пример:
    LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
    STRINGTABLE
    BEGIN
        101 "Привет, мир!"
    END
    
Ресурсы приложения
Системное программирование

5.2. Загрузка локализованных ресурсов

  • Используйте функции API, такие как LoadString, для загрузки строк на нужном языке.
  • Пример:
    LoadString(hInstance, 101, buffer, sizeof(buffer));
    
Ресурсы приложения
Системное программирование

6. Пример программы с использованием ресурсов

Рассмотрим пример простого Windows-приложения, которое использует ресурсы:

6.1. Файл ресурсов (app.rc)

IDI_ICON1 ICON "app.ico"
IDD_DIALOG1 DIALOGEX 0, 0, 200, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Пример диалога"
BEGIN
    DEFPUSHBUTTON "OK", IDOK, 10, 70, 50, 14
    PUSHBUTTON "Отмена", IDCANCEL, 70, 70, 50, 14
END
Ресурсы приложения
Системное программирование

6.2. Код программы (main.c)

#include <windows.h>

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
                EndDialog(hwndDlg, LOWORD(wParam));
                return TRUE;
            }
            break;
    }
    return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
    return 0;
}
Ресурсы приложения